// 安装。
// rustup：curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
// 添加环境。
// export PATH="$HOME/.cargo/bin:$PATH"
// 创建工程。
// cargo new hello
// cd hello
// 编译。
// cargo build
// 运行。
// ./target/debug/hello
// 清理。
// cargo clean
// i8,u8,i16,u16,i32,u32,i64,u64,i128,u128,f32,f64,bool,char,isize,usize.
// use std::mem;
// rust函数命令使用蛇形命名法。

fn chk_add_fun(ival1 : i32, ival2 : i32) -> i32 {
    // 返回命令不要加';'，
    ival1 + ival2
}

fn main() {
    {
        println!("[{},{}]add rst:{}", file!(), line!(), chk_add_fun(1, 2));
    }
    {
        let tmpfun : fn(i32, i32) -> i32 = chk_add_fun;// function pointer.
        println!("[{},{}]add rst:{}", file!(), line!(), tmpfun(2, 3));
    }
    {
        let tmpfun = |ival1 : i32, ival2 : i32| ival1 + ival2;
        println!("[{},{}]add rst:{}", file!(), line!(), tmpfun(3, 4));
    }
    {
        let tmpfun = |ival1 : i32, ival2 : i32| -> i32 {
            ival1 + ival2
        };
        println!("[{},{}]add rst:{}", file!(), line!(), tmpfun(5, 6));
    }
    {
        let tmpv1 = 1;
        let tmpv2 = 2;
        println!("[{},{}]call func param ptr:{:p}, {:p}", file!(), line!(), &tmpv1, &tmpv2);
        chk_print_ptr(tmpv1, tmpv2);
        // 说明：带入的参数和函数运行的参数地址不一致。
    }
}

fn chk_print_ptr(ival1 : i32, ival2 : i32) -> i32 {
    println!("[{},{}]func run param ptr:{:p}, {:p}", file!(), line!(), &ival1, &ival2);
    1
}
